<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Dubbo服务版本管理指南 | 技术小馆</title>
    <link rel="stylesheet" href="https://cdn.staticfile.org/tailwindcss/2.2.19/tailwind.min.css">
    <link rel="stylesheet" href="https://cdn.staticfile.org/font-awesome/6.4.0/css/all.min.css">
    <link href="https://fonts.googleapis.com/css2?family=Noto+Serif+SC:wght@400;500;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
    <script src="https://cdn.jsdelivr.net/npm/mermaid@latest/dist/mermaid.min.js"></script>
    <style>
        :root {
            --primary: #2563eb;
            --primary-light: #3b82f6;
            --secondary: #7c3aed;
            --dark: #1e293b;
            --light: #f8fafc;
            --accent: #f59e0b;
        }
        
        body {
            font-family: 'Noto Sans SC', Tahoma, Arial, Roboto, "Droid Sans", "Helvetica Neue", 
                        "Droid Sans Fallback", "Heiti SC", "Hiragino Sans GB", Simsun, sans-serif;
            color: var(--dark);
            line-height: 1.6;
            background-color: #f9fafb;
        }
        
        h1, h2, h3, h4 {
            font-family: 'Noto Serif SC', serif;
            font-weight: 600;
            color: var(--dark);
        }
        
        .hero {
            background: linear-gradient(135deg, var(--primary) 0%, var(--secondary) 100%);
        }
        
        .card {
            transition: all 0.3s ease;
            box-shadow: 0 4px 6px rgba(0, 0, 0, 0.05);
        }
        
        .card:hover {
            transform: translateY(-4px);
            box-shadow: 0 10px 15px rgba(0, 0, 0, 0.1);
        }
        
        .code-block {
            font-family: 'Courier New', Courier, monospace;
            background-color: #2d3748;
            color: #f8fafc;
            border-radius: 0.375rem;
            position: relative;
        }
        
        .code-block::before {
            content: attr(data-lang);
            position: absolute;
            top: 0;
            right: 0;
            background-color: rgba(255,255,255,0.1);
            color: #94a3b8;
            padding: 0.25rem 0.5rem;
            font-size: 0.75rem;
            border-bottom-left-radius: 0.375rem;
        }
        
        .version-tag {
            display: inline-block;
            padding: 0.25rem 0.5rem;
            border-radius: 9999px;
            font-weight: 500;
            font-size: 0.75rem;
            margin-right: 0.5rem;
        }
        
        .version-v1 {
            background-color: #dbeafe;
            color: var(--primary);
        }
        
        .version-v2 {
            background-color: #ede9fe;
            color: var(--secondary);
        }
        
        .feature-icon {
            width: 3rem;
            height: 3rem;
            border-radius: 50%;
            display: flex;
            align-items: center;
            justify-content: center;
            margin-bottom: 1rem;
            color: white;
            font-size: 1.5rem;
        }
        
        a {
            color: var(--primary);
            transition: all 0.2s ease;
        }
        
        a:hover {
            color: var(--primary-light);
            text-decoration: underline;
        }
        
        .section-title {
            position: relative;
            padding-bottom: 0.5rem;
        }
        
        .section-title::after {
            content: '';
            position: absolute;
            bottom: 0;
            left: 0;
            width: 3rem;
            height: 3px;
            background: var(--primary);
            border-radius: 3px;
        }
    </style>
</head>
<body>
    <!-- Hero Section -->
    <section class="hero text-white py-20 px-4 md:px-0">
        <div class="container mx-auto max-w-5xl px-6">
            <div class="flex flex-col items-center text-center">
                <div class="flex items-center mb-4">
                    <span class="bg-white bg-opacity-20 px-3 py-1 rounded-full text-sm font-medium">Dubbo 微服务</span>
                </div>
                <h1 class="text-4xl md:text-5xl font-bold leading-tight mb-6">服务版本管理</h1>
                <p class="text-xl md:text-2xl max-w-3xl opacity-90 mb-8">
                    确保系统兼容性和稳定性的关键策略，实现平滑升级与多版本并存
                </p>
                <a href="#content" class="bg-white text-primary px-6 py-3 rounded-lg font-medium shadow-lg hover:bg-opacity-90 transition-all transform hover:scale-105">
                    探索版本管理 <i class="fas fa-arrow-down ml-2"></i>
                </a>
            </div>
        </div>
    </section>

    <!-- Main Content -->
    <main id="content" class="container mx-auto max-w-5xl px-6 py-12">
        <!-- Introduction -->
        <section class="mb-16">
            <div class="bg-white rounded-xl p-8 shadow-lg">
                <p class="text-lg leading-relaxed">
                    在 Dubbo 中，服务的版本管理是一个重要的功能，它允许开发者在不同的服务版本之间进行控制和切换，以确保系统的兼容性和稳定性。本指南将详细介绍 Dubbo 服务版本管理的核心概念、实现方式和最佳实践。
                </p>
            </div>
        </section>

        <!-- Concept Section -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold mb-8">1. 服务版本管理的概念</h2>
            <div class="grid md:grid-cols-2 gap-8">
                <div class="bg-white rounded-xl p-8 shadow-lg card">
                    <div class="feature-icon bg-primary">
                        <i class="fas fa-code-branch"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">为什么需要版本管理？</h3>
                    <p class="text-gray-700">
                        服务版本管理允许开发者在服务的不同版本之间进行控制。这对于处理服务的升级、回滚以及多版本并存等场景非常重要。通过版本管理，可以保证服务的平滑升级和兼容性，同时避免因版本问题导致的服务中断或兼容性问题。
                    </p>
                </div>
                <div class="bg-white rounded-xl p-8 shadow-lg card">
                    <div class="feature-icon bg-secondary">
                        <i class="fas fa-exchange-alt"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">版本管理的优势</h3>
                    <ul class="space-y-2 text-gray-700">
                        <li><i class="fas fa-check-circle text-green-500 mr-2"></i> 支持多版本服务并存</li>
                        <li><i class="fas fa-check-circle text-green-500 mr-2"></i> 实现平滑升级过渡</li>
                        <li><i class="fas fa-check-circle text-green-500 mr-2"></i> 快速回滚问题版本</li>
                        <li><i class="fas fa-check-circle text-green-500 mr-2"></i> 确保系统稳定性</li>
                    </ul>
                </div>
            </div>
        </section>

        <!-- Version Definition Section -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold mb-8">2. 如何定义服务版本</h2>
            <p class="text-gray-700 mb-8">
                在 Dubbo 中，服务的版本可以通过配置来定义。主要通过 <code class="bg-gray-100 px-2 py-1 rounded">version</code> 属性来指定服务的版本。
            </p>
            
            <div class="grid md:grid-cols-2 gap-8 mb-8">
                <div class="bg-white rounded-xl overflow-hidden shadow-lg card">
                    <div class="p-6">
                        <div class="flex items-center mb-4">
                            <div class="bg-blue-100 p-2 rounded-full mr-3">
                                <i class="fas fa-server text-blue-500"></i>
                            </div>
                            <h3 class="text-xl font-bold">服务提供者端</h3>
                        </div>
                        <p class="text-gray-700 mb-4">
                            在服务提供者端，可以通过 <code class="bg-gray-100 px-2 py-1 rounded">&lt;dubbo:service&gt;</code> 标签的 <code class="bg-gray-100 px-2 py-1 rounded">version</code> 属性来定义服务的版本。
                        </p>
                    </div>
                    <div class="code-block p-4 text-sm overflow-x-auto" data-lang="XML">
                        <pre>&lt;dubbo:service interface="com.example.UserService" 
            ref="userService" 
            version="1.0.0"/&gt;</pre>
                    </div>
                </div>
                
                <div class="bg-white rounded-xl overflow-hidden shadow-lg card">
                    <div class="p-6">
                        <div class="flex items-center mb-4">
                            <div class="bg-purple-100 p-2 rounded-full mr-3">
                                <i class="fas fa-laptop-code text-purple-500"></i>
                            </div>
                            <h3 class="text-xl font-bold">服务消费者端</h3>
                        </div>
                        <p class="text-gray-700 mb-4">
                            在服务消费者端，可以通过 <code class="bg-gray-100 px-2 py-1 rounded">&lt;dubbo:reference&gt;</code> 标签的 <code class="bg-gray-100 px-2 py-1 rounded">version</code> 属性来指定要消费的服务版本。
                        </p>
                    </div>
                    <div class="code-block p-4 text-sm overflow-x-auto" data-lang="XML">
                        <pre>&lt;dubbo:reference id="userService" 
            interface="com.example.UserService" 
            version="1.0.0"/&gt;</pre>
                    </div>
                </div>
            </div>
        </section>

        <!-- Version Strategy Section -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold mb-8">3. 服务版本管理策略</h2>
            
            <div class="grid md:grid-cols-3 gap-8 mb-12">
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <div class="feature-icon bg-indigo-500">
                        <i class="fas fa-layer-group"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">多版本并存</h3>
                    <p class="text-gray-700 mb-4">
                        Dubbo 支持多个版本的服务同时存在。这样可以在不同版本之间进行逐步切换，而不会中断服务。
                    </p>
                    <ul class="space-y-2 text-gray-700">
                        <li><span class="version-tag version-v1">v1.0.0</span> 服务提供者</li>
                        <li><span class="version-tag version-v2">v2.0.0</span> 服务提供者</li>
                        <li>消费者可以选择调用特定版本</li>
                    </ul>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <div class="feature-icon bg-green-500">
                        <i class="fas fa-arrow-up"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">版本升级</h3>
                    <p class="text-gray-700 mb-4">
                        在服务升级过程中，可以通过发布新版本的服务实现版本控制。建议使用逐步升级的方式。
                    </p>
                    <div class="flex items-center justify-between">
                        <div class="text-center">
                            <div class="version-tag version-v1 mx-auto mb-2">v1.0.0</div>
                            <p class="text-sm">旧版本</p>
                        </div>
                        <div class="text-2xl text-gray-400 mx-2">
                            <i class="fas fa-arrow-right"></i>
                        </div>
                        <div class="text-center">
                            <div class="version-tag version-v2 mx-auto mb-2">v2.0.0</div>
                            <p class="text-sm">新版本</p>
                        </div>
                    </div>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <div class="feature-icon bg-red-500">
                        <i class="fas fa-undo"></i>
                    </div>
                    <h3 class="text-xl font-bold mb-4">版本回滚</h3>
                    <p class="text-gray-700 mb-4">
                        在遇到新版本服务出现问题时，可以通过回滚到之前稳定的版本来解决问题。
                    </p>
                    <div class="flex items-center justify-between">
                        <div class="text-center">
                            <div class="version-tag version-v2 mx-auto mb-2">v2.0.0</div>
                            <p class="text-sm">问题版本</p>
                        </div>
                        <div class="text-2xl text-gray-400 mx-2">
                            <i class="fas fa-arrow-left"></i>
                        </div>
                        <div class="text-center">
                            <div class="version-tag version-v1 mx-auto mb-2">v1.0.0</div>
                            <p class="text-sm">稳定版本</p>
                        </div>
                    </div>
                </div>
            </div>
            
            <!-- Visualization -->
            <div class="bg-white rounded-xl p-6 shadow-lg mb-8">
                <h3 class="text-xl font-bold mb-6">版本管理流程可视化</h3>
                <div class="mermaid">
                    graph TD
                    A[服务提供者v1.0.0] -->|注册| Z[注册中心]
                    B[服务提供者v2.0.0] -->|注册| Z
                    Z -->|发现| C[消费者v1.0.0]
                    Z -->|发现| D[消费者v2.0.0]
                    C -->|调用| A
                    D -->|调用| B
                    style A fill:#dbeafe,stroke:#2563eb
                    style B fill:#ede9fe,stroke:#7c3aed
                    style C fill:#dbeafe,stroke:#2563eb
                    style D fill:#ede9fe,stroke:#7c3aed
                </div>
            </div>
        </section>

        <!-- Best Practices Section -->
        <section class="mb-16">
            <h2 class="section-title text-3xl font-bold mb-8">4. 版本管理的最佳实践</h2>
            
            <div class="grid md:grid-cols-2 gap-8">
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <h3 class="text-xl font-bold mb-4">4.1 使用语义化版本控制</h3>
                    <p class="text-gray-700 mb-4">
                        建议使用语义化版本控制（Semantic Versioning）来定义服务版本。这样可以更清晰地表示版本之间的兼容性和变化。
                    </p>
                    <div class="space-y-3">
                        <div class="flex items-center">
                            <div class="version-tag version-v1 mr-3">1.0.0</div>
                            <div>初始版本</div>
                        </div>
                        <div class="flex items-center">
                            <div class="version-tag version-v1 mr-3">1.1.0</div>
                            <div>功能增加，但保持向后兼容</div>
                        </div>
                        <div class="flex items-center">
                            <div class="version-tag version-v2 mr-3">2.0.0</div>
                            <div>重大更改，可能不兼容之前的版本</div>
                        </div>
                    </div>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <h3 class="text-xl font-bold mb-4">4.2 维护版本兼容性</h3>
                    <p class="text-gray-700 mb-4">
                        在升级服务版本时，确保新版本与旧版本的兼容性，或者提供兼容层，避免破坏现有消费者的功能。
                    </p>
                    <div class="bg-yellow-50 border-l-4 border-yellow-400 p-4">
                        <div class="flex">
                            <div class="flex-shrink-0">
                                <i class="fas fa-exclamation-circle text-yellow-400"></i>
                            </div>
                            <div class="ml-3">
                                <p class="text-sm text-yellow-700">
                                    重要提示：在发布不兼容版本时，应提前通知所有消费者，并提供迁移指南。
                                </p>
                            </div>
                        </div>
                    </div>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <h3 class="text-xl font-bold mb-4">4.3 使用版本化的接口</h3>
                    <p class="text-gray-700 mb-4">
                        在某些场景下，可能需要使用版本化的接口来支持不同版本的服务。
                    </p>
                    <div class="code-block p-4 text-sm overflow-x-auto" data-lang="Java">
                        <pre>public interface UserServiceV1 {
    User getUserById(String userId);
}

public interface UserServiceV2 {
    User getUserById(String userId);
    User getUserByEmail(String email);
}</pre>
                    </div>
                </div>
                
                <div class="bg-white rounded-xl p-6 shadow-lg card">
                    <h3 class="text-xl font-bold mb-4">4.4 版本测试</h3>
                    <p class="text-gray-700 mb-4">
                        在发布新版本之前，进行充分的版本测试，包括功能测试、兼容性测试和性能测试，确保新版本的稳定性和性能。
                    </p>
                    <ul class="space-y-2 text-gray-700">
                        <li><i class="fas fa-check text-green-500 mr-2"></i> 单元测试</li>
                        <li><i class="fas fa-check text-green-500 mr-2"></i> 集成测试</li>
                        <li><i class="fas fa-check text-green-500 mr-2"></i> 兼容性测试</li>
                        <li><i class="fas fa-check text-green-500 mr-2"></i> 性能测试</li>
                        <li><i class="fas fa-check text-green-500 mr-2"></i> 灰度发布</li>
                    </ul>
                </div>
            </div>
        </section>

        <!-- Summary Section -->
        <section class="mb-16">
            <div class="bg-blue-50 rounded-xl p-8 shadow-lg border border-blue-100">
                <h2 class="text-2xl font-bold mb-4 text-blue-800">关键总结</h2>
                <div class="grid md:grid-cols-2 gap-6">
                    <div>
                        <h3 class="text-lg font-semibold mb-3 text-blue-700">版本管理核心价值</h3>
                        <ul class="space-y-2 text-blue-800">
                            <li><i class="fas fa-check-circle text-blue-500 mr-2"></i> 确保系统稳定性</li>
                            <li><i class="fas fa-check-circle text-blue-500 mr-2"></i> 支持平滑升级</li>
                            <li><i class="fas fa-check-circle text-blue-500 mr-2"></i> 实现快速回滚</li>
                            <li><i class="fas fa-check-circle text-blue-500 mr-2"></i> 多版本并存支持</li>
                        </ul>
                    </div>
                    <div>
                        <h3 class="text-lg font-semibold mb-3 text-blue-700">实施建议</h3>
                        <ul class="space-y-2 text-blue-800">
                            <li><i class="fas fa-lightbulb text-yellow-500 mr-2"></i> 遵循语义化版本规范</li>
                            <li><i class="fas fa-lightbulb text-yellow-500 mr-2"></i> 充分测试新版本</li>
                            <li><i class="fas fa-lightbulb text-yellow-500 mr-2"></i> 渐进式发布策略</li>
                            <li><i class="fas fa-lightbulb text-yellow-500 mr-2"></i> 完善的监控机制</li>
                        </ul>
                    </div>
                </div>
            </div>
        </section>
    </main>

    <!-- Footer -->
    <footer class="bg-gray-900 text-gray-300 py-12">
        <div class="container mx-auto max-w-5xl px-6">
            <div class="flex flex-col items-center">
                <div class="text-2xl font-bold text-white mb-4">技术小馆</div>
                <p class="mb-6">探索技术之美，分享开发之道</p>
                <a href="http://www.yuque.com/jtostring" class="text-blue-300 hover:text-white transition-colors">
                    <i class="fas fa-globe mr-2"></i> http://www.yuque.com/jtostring
                </a>
            </div>
        </div>
    </footer>

    <script>
        // Initialize Mermaid
        mermaid.initialize({
            startOnLoad: true,
            theme: 'default',
            flowchart: {
                useMaxWidth: true,
                htmlLabels: true,
                curve: 'basis'
            }
        });
        
        // Add smooth scrolling for anchor links
        document.querySelectorAll('a[href^="#"]').forEach(anchor => {
            anchor.addEventListener('click', function (e) {
                e.preventDefault();
                
                document.querySelector(this.getAttribute('href')).scrollIntoView({
                    behavior: 'smooth'
                });
            });
        });
    </script>
</body>
</html>